import axios from "axios";
import { Message } from "element-ui";
// 拿token有2种方式：方式1: 读取vuex的state; 方式2：读取cookie
import store from "@/store";
import router from "@/router";
import { getLoginTime } from "@/utils/auth";
// 主动检查token过期的方法
const tokenLongTime = 1000 * 60 * 60 * 2;
// const tokenLongTime = 1000 * 5;
function checkTimeOut() {
  let curTime = Date.now(); // 发生请求的时间
  let loginTime = getLoginTime(); // 登录当时的时间
  if (curTime - loginTime > tokenLongTime) {
    return true; // 过期了
  } else {
    return false; // 没有过期
  }
}

// 创建了一个新的axios实例
const service = axios.create({
  // 读取环境变量文件里面的VUE_APP_BASE_API作为基准地址
  baseURL: process.env.VUE_APP_BASE_API, // 接口基准地址
  timeout: 5000, // 超时时间
});

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    // 一定要return config，否则请求发生不出去
    if (store.getters.token) {
      // 有token，才判断是否过期
      if (checkTimeOut()) {
        Message.error("token过期，请重新登录");
        store.dispatch("user/quitAction");
        router.push("/login");
        return Promise.reject("token过期，请重新登录");
      }
      // 没有过期就携带上
      config.headers.Authorization = "Bearer " + store.getters.token;
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 响应拦截器 【解构数据，集中的错误处理，token过期】
service.interceptors.response.use(
  (response) => {
    // 一定要return，否则请求方法那边拿不到数据
    const { success, code, data, message } = response.data;
    if (success) {
      // 业务成功
      return data;
    } else {
      // 业务失败
      Message.error(message);
      return Promise.reject(message);
    }
  },
  (error) => {
    console.log("请求错误");
    if (
      error.response &&
      error.response.data &&
      error.response.data.code === 10002
    ) {
      // token过期了
      store.dispatch("user/quitAction");
      router.push("/login");
      Message.error("token过期，请求重新登录");
    } else {
      Message.error("请求异常");
    }
    // 请求错误
    return Promise.reject(error);
  }
);
// 暴露
export default service;
